;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; lsp-mode: language server protocol integration with Emacs ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Docs: https://emacs-lsp.github.io/lsp-mode/
(use-package lsp-mode
  :ensure t
  :commands lsp
  :hook ((c-mode . lsp-deferred) ; Enable language servers here
         (c++-mode . lsp-deferred)
         (python-mode . lsp-deferred))
  :config
  (use-package lsp-ui ; UI integrations with lsp-mode
    :ensure t
    :commands lsp-ui-mode)
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;;; Company: Auto-completion engine ;;;
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; Docs: https://github.com/company-mode/company-mode/
  (use-package company
    :ensure t
    :hook (after-init-hook . global-company-mode) ; Always enable company
    :config
    (setq company-minimum-prefix-length 1 ; What?
          company-idle-delay 0.1) ; Disable completion delay, default is 0.2 sec
    (use-package company-box ; Icons for company-mode
      :ensure t
      :hook (company-mode . company-box-mode)))
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;;; Tree-sitter: Better syntax highlighting ;;;
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; Docs: https://emacs-tree-sitter.github.io/
  (use-package tree-sitter
    :ensure t
    :hook ((prog-mode-hook . tree-sitter-mode)
           (prog-mode-hook . tree-sitter-hl-mode))
    :config
    (use-package tree-sitter-langs
      :ensure t))
  ;;;;;;;;;;;;;;;;;
  ;;; Flycheck: ;;;
  ;;;;;;;;;;;;;;;;;
  ;; Docs:
  ;; TODO
  (use-package flycheck
    :ensure t)
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;;; Dap-mode: Debugger integration for Emacs ;;;
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;; Docs:
  ;; TODO:
  (use-package dap-mode
    :ensure t
    :config (dap-auto-configure-mode)))

;;;; Addional language support
(use-package meson-mode
  :ensure t)
(use-package cmake-mode
  :ensure t)
;;;; Java development plugin
(use-package lsp-java
  :ensure t
  :after lsp-mode
  :config
  (require 'lsp-java)
  (add-hook 'java-mode-hook #'lsp))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Slime: Superior Lisp Interaction Mode for Emacs. ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Docs: https://github.com/slime/slime
(use-package slime
  :ensure t
  ;:hook (lisp-mode . slime)
  :config (setq inferior-lisp-program "sbcl"))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Cider: Clojure(Script) Interactive Development Environment that Rocks ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Docs: https://github.com/clojure-emacs/cider
(use-package cider
  :ensure t
  :after company
  :hook ((clojure-mode . cider-mode)
         (cider-mode-hook . company-mode)
         (cider-repl-mode-hook . company-mode)))
